package day06;

import java.io.*;

/*
文件读写：40+类。
    读文件：从磁盘读取到内存中。input、reader
    写文件：从内存写到磁盘。output、writer

    按操作的单位：字符流（每次读写一个字符）、字节流（每次读写一个字节）。
    InputStream ：读文件，字节流。父类；FileInputStream 是它的子类
    OutputStream：写文件，字节流。父类；FileOutputStream 是它的子类

    Reader：读文件，字符流。父类；FileReader、BufferedFileReader……
    Writer：写文件，字符流。父类；FileWriter、BufferedFileWriter……

    操作的方法是一样的，只是处理的单位不同。

    读文件步骤：
        创建一个FileInputStream对象
        调用read方法读文件
        使用close关闭对象

    写文件步骤：
        创建一个FileOutputStream对象
        调用write方法写文件
        使用close关闭对象

 */
public class Demo06 {
    /*
    FileReader 读文件
     */
    public static void read1(String path) throws IOException {
        // 创建一个对象
        FileReader fr = new FileReader(path);
        // 使用read读取一个字符
        int c = fr.read();
        while (c != -1) { // -1表示达到文件末尾
            System.out.print((char) c);
            c = fr.read(); // 继续读下一个字符
        }

        // 关闭对象
        fr.close();
    }

    /*
    BufferedReader 读文件(常用)
     */
    public static void read2(String path) throws IOException {
        // Reader 是抽象类，用它任意的子类来实例化
        Reader reader = new FileReader(path);
        // BufferedReader 的构造方法需要Reader类型的参数
        BufferedReader br = new BufferedReader(reader);

        String line = br.readLine();
        System.out.println(line);

        br.close();
        reader.close();
    }

    public static void write1(String path, String content) throws IOException {
        FileWriter fw = new FileWriter(path, true); // true表示追加，false表示覆盖写文件
        fw.write(content);
        fw.close();
        System.out.println("写文件已完成。");
    }

    public static void write2(String path, String content) throws IOException {
        // OutputStream 抽象类，用它的子类来实例化
        OutputStream os = new FileOutputStream(path);
        // OutputStreamWriter 支持设置编码方式
        // OutputStreamWriter 第一个参数为OutputStream的对象
        OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
        osw.write(content);
        osw.close();
        os.close();
        System.out.println("写文件已完成。");
    }

    public static void main(String[] args) throws IOException {
        System.out.println("================read1=====================");
        read1("C:\\LearnJava44\\src\\day06\\Demo01.java");
        System.out.println("===============read2======================");
        read2("C:\\LearnJava44\\src\\day06\\Demo01.java");
        System.out.println("===============write1======================");
        String content = "黄河之水天上来，奔流到海不复回";
        write1("C:\\LearnJava44\\src\\day06\\test.txt", content);
        write2("C:\\LearnJava44\\src\\day06\\test2.txt", content);
    }
}
